<?php /** 查询试卷结果信息 api **/
require_once '../../config/req.conf.php';
require_once '../../utils/CommonMethods.php';
require_once '../../utils/VerifyFormData.php';
require_once '../../utils/DBUtils.php';
require_once '../../utils/CommonFun.php';

/* 1. token认证和角色权限校验 */
$headers = apache_request_headers(); // 请求头信息获取
$info = VerifyFormData::verifyRole($headers['Authorization'], "examinee");
if( CommonMethods::isEmpty($info) ){
    RespJson::fail("没有访问权限");
    return;
}

/* 2. 处理表单中的数据信息 */
if( !VerifyFormData::isEmptyAndEscape($_POST) ) return;

/* 3. 获取当前的考试信息 */
DBUtils::init();
$paper = DBUtils::queryOne( // 获取到试卷的详细信息 php_paper
    DBUtils::getSql("php_paper")->where("id = {$_POST['id']}")->select()
);
if( CommonMethods::isEmpty($paper) ){
    RespJson::fail("不存在该试卷");
    return;
}

$user_paper = DBUtils::queryOne( // 获取该用户对应试卷的详情信息 php_user_paper
    DBUtils::getSql("php_user_paper")
        ->where("uId = {$info['id']} and pId = {$paper['id']}")
        ->select()
);

$status = isTest($paper, $user_paper, $isEnd); // 获取考试状态信息

if( !$isEnd ){ // 如果此时考试还没结束, 那么就不能进一步进行查询信息
    RespJson::fail("考试还没结束, 不能查看信息");
} else if( $isEnd && $status !== '已提交' ){ // 考试结束了, 但是状态不是已提交, 那么就是没考试
    RespJson::fail("该考试逾期未作答, 考试未通过");
} else{ // 否则就是考试结束了, 然后已提交的状态, 就可以查询成绩了
    /* 判断用户的 rank 是否为空, 为空那么就计算一下分数 */
    if( CommonMethods::isEmpty($user_paper['rank']) ){
        // 将答题数据进行解码
        $answer_array = json_decode($user_paper['answerJson'], true);
        $correctCount = 0; // 正确题数
        // 向数据库查询数据
        foreach ($answer_array as $questionId => $change){
            $result = DBUtils::queryOne(
                DBUtils::getSql("php_questions")
                    ->filter("id")
                    ->where("id = {$questionId} and answer = '{$change}'")
                    ->select()
            );
            if( !CommonMethods::isEmpty($result) ){
                $correctCount++;
            }
        }
        // 进行等级的计算
        $score = $correctCount / count($answer_array);
        $rank = getRank($score);
        // 进行数据库的存储
        DBUtils::execute(
            DBUtils::getSql("php_user_paper")
                ->set("rank = '{$rank}'")
                ->where("uId = {$info['id']} and pId = {$paper['id']}")
                ->update()
        );
        /* 通过判断等级来修改用户的通过与否 */
        if( $rank !== '不及格' ){
            DBUtils::execute(
                DBUtils::getSql("php_user")
                    ->set("isPass = 1")
                    ->where("id = {$info['id']}")
                    ->update()
            );
        }
        RespJson::fail("本次考试的结果为: " . $rank);
    }else{ // 不为空, 那么就返回等级信息
        RespJson::fail("本次考试的结果为: " . $user_paper['rank']);
    }
}
